//
//  JTClearCacheTableViewCell.m
//  百思不得姐
//
//  Created by Robin Zhang on 2016/12/29.
//  Copyright © 2016年 BeiJingWangDianJieTong. All rights reserved.
//

#import "JTClearCacheTableViewCell.h"
#import <SDImageCache.h>
#import <SVProgressHUD.h>

#define JTCustomCacheFile [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"Custom"]

@implementation JTClearCacheTableViewCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        
        // 1.设置数据
        [self.textLabel setText:@"清除缓存(正在计算缓存大小...)"];
        // 禁止点击(如果设置文字之前userInteractionEnabled=NO，那么文字会自动变为浅灰色)
        [self setUserInteractionEnabled:NO];
        // 设置cell右边的指示器(用来说明正在处理一些事情)
        UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
        [loadingView startAnimating];
        [self setAccessoryView:loadingView];
        
        /** 
         typeof(<#type#>)指的是查看“type”代表的类型
         例子：
         int i = 10;
         typeof(i) j = 20; == int j = 20;
         */
//        __weak typeof(self) weak_self = self;
        
        JTWeak(self)
        // 2.在子线程计算缓存大小
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            // 2.1 获得缓存文件夹路径
            unsigned long long size = JTCustomCacheFile.jt_fileSize;
            size += [SDImageCache sharedImageCache].getSize;
            
            /* 2.1.5 如果耗时操作已经执行完毕但所持对象已被释放，那么就不执行接下来的部分了 */
            if (!weak_self) return;
            
            NSString *sizeText = nil;
            /**
             double return = pow(double a, double b)
             乘方运算；即为 a的b次方。返回值与参数均为double类型
             */
            if (size >= pow(10, 9)) { // size >= 1GB
                
                sizeText = [NSString stringWithFormat:@"%.2fGB", size / pow(10, 9)];
            }
            else if (size >= pow(10, 6)) { // 1GB > size >= 1MB
                
                sizeText = [NSString stringWithFormat:@"%.2fMB", size / pow(10, 6)];
            }
            else if (size >= pow(10, 3))  { // 1MB > size >= 1KB
                
                sizeText = [NSString stringWithFormat:@"%.2fKB", size / pow(10, 3)];
            }
            else { // size < 1KB
                
                sizeText = [NSString stringWithFormat:@"%zdB", size];
            }
            
            // 2.2 主线程文字
            NSString *text = [NSString stringWithFormat:@"清除缓存(%@)", sizeText];
            
            // 2.3 回到主线程
            dispatch_async(dispatch_get_main_queue(), ^{
                
                // 设置文字
                [weak_self.textLabel setText:text];
                // 清空右边的指示器
                [weak_self setAccessoryView:nil];
                // 显示右边的箭头
                [weak_self setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
            });
            
            // 添加手势监听器
            [weak_self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:weak_self action:@selector(clearChches:)]];
            [weak_self setUserInteractionEnabled:YES];
        });
    }
    
    return self;
}

/**
 清除缓存
 */
- (void)clearChches:(UITapGestureRecognizer *)sender {
    
    // 1.弹出指示器
    [SVProgressHUD showWithStatus:@"正在清除缓存"];
    
    // 2.删除缓存文件
    // 2.1 删除SDWebImage的缓存
    [[SDImageCache sharedImageCache] clearDiskOnCompletion:^{
        
        // 2.2 删除自定义的缓存
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            NSFileManager *manager = [NSFileManager defaultManager];
            [manager removeItemAtPath:JTCustomCacheFile error:nil];
            [manager createDirectoryAtPath:JTCustomCacheFile withIntermediateDirectories:YES attributes:nil error:nil];
            
            // 2.3 所有的缓存都清除完毕，回到主线程
            dispatch_async(dispatch_get_main_queue(), ^{
               
                // 2.3.1 隐藏指示器
                [SVProgressHUD dismiss];
                
                // 2.3.2 设置文字
                [self.textLabel setText:@"清除缓存(0B)"];
            });
        });
    }];
}

/**
    裆cell重新显示到屏幕上时，也会调用一次layoutSubviews
 */
- (void)layoutSubviews {
    [super layoutSubviews];
    
    // cell重新显示的时候继续动画
    [(UIActivityIndicatorView *)self.accessoryView startAnimating];
}

@end
